﻿//Di Carbone Carlo
//carbone05@gmail.com

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlAttivita
    {
        private Connector connector = Connector.Istance();
        protected List<DettaglioAttivita> elenco;
        protected Attivita attivita;

        public ctrlAttivita(Attivita attivita)
        {
            this.attivita = attivita;
            if (attivita != null && attivita.DettagliAttivita != null)
                elenco = attivita.DettagliAttivita;
            if (attivita != null && (attivita.DettagliAttivita == null || attivita.DettagliAttivita.Count == 0))
                attivita.DettagliAttivita = GetDettagliByAttivitaId(attivita.Id);
        }

        public ctrlAttivita(Attivita Attivita, string a = "")
        {
            this.attivita = Attivita;
            if (attivita != null && attivita.DettagliAttivita != null)
                elenco = attivita.DettagliAttivita;
        }

        public AttivitaEsistente VerificaAttivitaEsistente(int numeroStanza)
        {
            string query;
            query = @"SELECT Attivita.id, Corsi.codice, Corsi.nome,Corsi.datainizio
                    ,Corsi.datafine, Attivita.descrizione,Attivita.senzafine AS SenzaFine, Stanze.numero
                    FROM Attivita LEFT OUTER JOIN
                         Corsi ON Attivita.idcorso = Corsi.id LEFT OUTER JOIN
                         Stanze ON Attivita.idstanza = Stanze.id
                    WHERE Stanze.numero=" + numeroStanza;

            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            if (dt.Rows.Count > 0)
            {
                DataRow row = dt.Rows[0];
                if ((bool)row["SenzaFine"])
                {
                    return AttivitaEsistente.TempoIndeterminato;
                }
                else if ((row["datafine"]) != DBNull.Value
                    && ((DateTime)row["datafine"]).Date >= DateTime.Now.Date)
                {
                    return AttivitaEsistente.Esistente;
                }
                return AttivitaEsistente.AttivitaFinita;
            }
            else
            {
                return AttivitaEsistente.NonEsistente;
            }
        }

        public Corso GetCorsoByStanza(int numero)
        {
            Corso c = new Corso();

            string query = @"SELECT        Corsi.id AS Id, Corsi.nome As Nome, Corsi.codice AS Codice,
                            Corsi.datainizio AS DataInizio, Corsi.numeroore AS NumeroOre, Corsi.datafine As DataFine
                            FROM            Attivita INNER JOIN
                         Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                         Stanze ON Attivita.idstanza = Stanze.id
                WHERE        (Stanze.numero = " + numero + ")";

            DataTable table = new DataTable();
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            sda.Fill(table);

            if (table.Rows.Count > 0)
            {
                DataRow riga = table.Rows[0];
                c.Id = (Guid)riga["Id"];
                c.Nome = (string)riga["Nome"];
                c.NumeroOre = (int)riga["NumeroOre"];
                c.DataInizio = (DateTime)riga["DataInizio"];
                c.DataFine = (DateTime?)riga["DataFine"];
                c.Codice = (string)riga["Codice"];
            }

            return c;
        }

        public bool VerificaPossibilitàInserimento(int numero, Corso corso)
        {
            string query = @"SELECT
                                 Corsi.id, Corsi.codice, Corsi.datainizio, Corsi.nome, Corsi.numeroore, Corsi.datafine AS DataFine, Stanze.numero
                                ,Attivita.descrizione, Attivita.senzafine
                            FROM
                                Corsi INNER JOIN
                                Attivita ON Corsi.id = Attivita.idcorso INNER JOIN
                                Stanze ON Attivita.idstanza = Stanze.id
                            WHERE
                                (Stanze.numero = @Param1) AND (Corsi.datafine >= @Param2) AND (Attivita.senzafine = 0)";
            DataTable table = new DataTable();

            SqlCommand insertParameter = new SqlCommand(query, connector.Connessione);
            SqlParameter Numero = new SqlParameter();
            Numero.ParameterName = "@Param1";
            Numero.SqlDbType = SqlDbType.Int;
            Numero.Value = numero;
            insertParameter.Parameters.Add(Numero);

            SqlParameter datafine = new SqlParameter();
            datafine.ParameterName = "@Param2";
            datafine.SqlDbType = SqlDbType.DateTime;
            datafine.Value = corso.DataInizio;
            insertParameter.Parameters.Add(datafine);
            SqlDataReader sdr = insertParameter.ExecuteReader();
            table.Load(sdr);
            if (table.Rows.Count > 0)
            {
                return false;
            }
            return true;
        }

        public bool AttivitaValida(Tessera tessera)
        {
            string sql = @"SELECT Tessere.codice AS CodiceTessera, Persone.nome AS Nome, Persone.cognome AS Cognome, Attivita.descrizione AS Attivita, Corsi.datainizio AS Inizio,
                      Corsi.datafine AS Fine
                FROM Attivita INNER JOIN
                      Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                      Persone ON Attivita.id = Persone.idattivita INNER JOIN
                      Tessere ON Persone.idtessera = Tessere.id
                WHERE (Tessere.codice ='" + tessera.Codice + "') AND (Corsi.datafine <= { fn NOW() }) AND (Corsi.datainizio IS NOT NULL) OR (Corsi.datafine IS NULL)";

            SqlDataAdapter com = new SqlDataAdapter(sql, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            if (dt.Rows.Count > 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Inserisce una nuova attivita in tabella Attivita
        /// </summary>
        /// <param name="attivita">Restituisce il numero di righe modificate;-1 se va in err</param>
        public virtual int Inserisci()
        {
            string query = "INSERT INTO Attivita VALUES"
                + "(@id,@idcorso,@descrizione, @senzafine, @idstanza)";
            try
            {
                SqlCommand insert = new SqlCommand(query, connector.Connessione);
                if (connector.Transaction != null)
                    insert.Transaction = connector.Transaction;

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = attivita.Id;
                insert.Parameters.Add(id);

                SqlParameter idcorso = new SqlParameter();
                idcorso.ParameterName = "@idcorso";
                idcorso.SqlDbType = SqlDbType.UniqueIdentifier;

                if (attivita.Corso != null)
                {
                    idcorso.Value = attivita.Corso.Id;
                }
                else
                {
                    idcorso.Value = DBNull.Value;
                }
                insert.Parameters.Add(idcorso);

                SqlParameter descrizione = new SqlParameter();
                descrizione.ParameterName = "@descrizione";
                descrizione.SqlDbType = SqlDbType.NVarChar;
                descrizione.Value = attivita.Descrizione;
                insert.Parameters.Add(descrizione);

                SqlParameter senzafine = new SqlParameter();
                senzafine.ParameterName = "@senzafine";
                senzafine.SqlDbType = SqlDbType.Bit;
                senzafine.Value = attivita.SenzaFine;
                insert.Parameters.Add(senzafine);

                SqlParameter idstanza = new SqlParameter();
                idstanza.ParameterName = "@idstanza";
                idstanza.SqlDbType = SqlDbType.UniqueIdentifier;
                idstanza.Value = attivita.Stanza.Id;
                insert.Parameters.Add(idstanza);

                return insert.ExecuteNonQuery();
            }
            catch
            {
                return -1;
            }
        }

        /// <summary>
        /// Modifica una riga
        /// </summary>
        /// <param name="attivita"></param>
        public int Update()
        {
            string query = "UPDATE Attivita SET "
                    + "idcorso = @idcorso, descrizione = @descrizione, senzafine = @senzafine, idstanza =  @idstanza"
                    + " WHERE id = @condizione";
            try
            {
                SqlCommand update = new SqlCommand(query, connector.Connessione);
                if (connector.Transaction != null)
                    update.Transaction = connector.Transaction;
                SqlParameter idcorso = new SqlParameter();
                idcorso.ParameterName = "@idcorso";
                idcorso.SqlDbType = SqlDbType.UniqueIdentifier;
                idcorso.Value = attivita.Corso.Id;
                update.Parameters.Add(idcorso);

                SqlParameter descrizione = new SqlParameter();
                descrizione.ParameterName = "@descrizione";
                descrizione.SqlDbType = SqlDbType.NVarChar;
                descrizione.Value = attivita.Descrizione;
                update.Parameters.Add(descrizione);

                SqlParameter senzafine = new SqlParameter();
                senzafine.ParameterName = "@senzafine";
                senzafine.SqlDbType = SqlDbType.Bit;
                senzafine.Value = attivita.SenzaFine;
                update.Parameters.Add(senzafine);

                SqlParameter idstanza = new SqlParameter();
                idstanza.ParameterName = "@idstanza";
                idstanza.SqlDbType = SqlDbType.UniqueIdentifier;
                idstanza.Value = attivita.Stanza.Id;
                update.Parameters.Add(idstanza);

                SqlParameter idattivita = new SqlParameter();
                idattivita.ParameterName = "@condizione";
                idattivita.SqlDbType = SqlDbType.UniqueIdentifier;
                idattivita.Value = attivita.Id;
                update.Parameters.Add(idattivita);

                return update.ExecuteNonQuery();
            }
            catch
            {
                return -1;
            }
        }

        /// <summary>
        /// Cancella un elemento dal database
        /// </summary>
        /// <param name="attivitaDaCancellare"></param>
        /// <returns>Numero di righe cancellate</returns>
        public int Delete(Attivita attivitaDaCancellare)
        {
            string query = " DELETE FROM Attivita WHERE id = @condizione";
            SqlCommand elimina = new SqlCommand(query, connector.Connessione);
            if (connector.Transaction != null)
                elimina.Transaction = connector.Transaction;
            SqlParameter condizione = new SqlParameter();
            condizione.ParameterName = "@condizione";
            condizione.SqlDbType = SqlDbType.UniqueIdentifier;
            condizione.Value = attivitaDaCancellare.Id;
            elimina.Parameters.Add(condizione);

            return elimina.ExecuteNonQuery();
        }

        public int Delete(Guid id)
        {
            string query = " DELETE FROM Attivita WHERE id = @condizione";
            SqlCommand elimina = new SqlCommand(query, connector.Connessione);
            if (connector.Transaction != null)
                elimina.Transaction = connector.Transaction;
            SqlParameter condizione = new SqlParameter();
            condizione.ParameterName = "@condizione";
            condizione.SqlDbType = SqlDbType.UniqueIdentifier;
            condizione.Value = id;
            elimina.Parameters.Add(condizione);

            return elimina.ExecuteNonQuery();
        }

        /// <summary>
        /// Ricerca in tabella attivita (metodo completamente personalizzabile)
        /// </summary>
        /// <param name="campi"></param>
        /// <param name="condizione"></param>
        /// <param name="ordinamento"></param>
        /// <returns>Rest. un datatable</returns>
        public virtual DataTable Ricerca(string campi,
            string condizione = "1=1", string ordinamento = "")
        {
            string query;
            query = "SELECT " + campi
                + " FROM Attivita "
                + " WHERE " + condizione
                + " " + ordinamento;
            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            return dt;
        }

        public List<Attivita> AttivitaInCorsoSenzaAlunni()
        {
            string query = @"SELECT
                                Attivita.id AS IdAttivita, Attivita.descrizione AS DescrizioneAttivita, Attivita.senzafine AS SenzaFine,
                                Corsi.id AS IdCorso, Corsi.nome AS NomeCorso,
                                Stanze.numero AS Numero, Stanze.id AS IdStanza, Stanze.capienza AS Capienza
                             FROM
                                Attivita INNER JOIN
                                DettaglioAttivita ON Attivita.id = DettaglioAttivita.idattivita INNER JOIN
                                Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                                Stanze ON Attivita.idstanza = Stanze.id LEFT OUTER JOIN
                                Persone ON Attivita.id = Persone.idattivita
                            WHERE
                                (Persone.idattivita IS NULL)
                            GROUP BY
                                Attivita.id, Attivita.descrizione, Persone.id, Corsi.id, Corsi.nome, Stanze.numero, Stanze.id, Stanze.capienza, Attivita.senzafine
                            HAVING
                                (MAX(DettaglioAttivita.giorno) >= { fn NOW() })";
            List<Attivita> listaAttivita = new List<Attivita>();

            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            DataTable dataTable = new DataTable();
            sda.Fill(dataTable);
            ctrlCorso cCorso = new ctrlCorso();
            foreach (DataRow row in dataTable.Rows)
            {
                Attivita attività = new Attivita();
                attività.Id = (Guid)row["IdAttivita"];
                attività.Descrizione = (string)row["DescrizioneAttivita"];
                attività.SenzaFine = (bool)row["SenzaFine"];
                attività.Corso = new Corso();
                attività.Corso.Id = (Guid)row["IdCorso"];
                attività.Corso.Nome = (string)row["NomeCorso"];
                attività.Stanza = new Stanza();
                attività.Stanza.Id = (Guid)row["IdStanza"];
                attività.Stanza.Numero = (int)row["Numero"];
                attività.Stanza.Capienza = (int)row["Capienza"];
                listaAttivita.Add(attività);
            }

            return listaAttivita;
        }

        public List<Attivita> GetAttivitaIndeterminate()
        {
            List<Attivita> listaAttivita = new List<Attivita>();
            string query = @"
                Select *
                from Attivita
                Where idcorso is Null
            ";
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            DataTable attivitaIndet = new DataTable();
            sda.Fill(attivitaIndet);

            foreach (DataRow riga in attivitaIndet.Rows)
            {
                listaAttivita.Add(new Attivita
                {
                    Corso = null,
                    Descrizione = riga["descrizione"].ToString(),
                    SenzaFine = (bool)riga["senzafine"],
                    Id = (Guid)riga["id"],
                    Stanza = new ctrlStanza().GetStanzaById((Guid)riga["idstanza"])
                });
            }
            return listaAttivita;
        }

        public List<Attivita> AttivitaInCorsoSenzaAlunniEAuleNonPiene()
        {
            List<Attivita> listaAttivita = new List<Attivita>();
            string query = @"
                    SELECT
                          Attivita.id AS IdAttivita, Attivita.descrizione AS DescrizioneAttivita,
                          Corsi.id AS IdCorso,
                          Corsi.nome AS NomeCorso, Stanze.numero AS Numero, Stanze.id AS IdStanza,
                          Attivita.senzafine AS SenzaFine, Stanze.capienza AS Capienza,
                          COUNT(Stanze.numero) AS NumeroPersonePresenti, Persone.idattivita AS Expr1
                    FROM
                         Attivita left JOIN
                         Stanze ON Attivita.idstanza = Stanze.id left JOIN
                         Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                         Persone ON Attivita.id = Persone.idattivita
                    GROUP BY
                            Attivita.id, Attivita.descrizione, Corsi.id, Corsi.nome, Stanze.numero,
                            Stanze.id, Stanze.capienza, Persone.idattivita, Attivita.senzafine
                    HAVING
                            (COUNT(Stanze.numero) <= Stanze.capienza)";
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            DataTable tableAulePieneInCorso = new DataTable();
            sda.Fill(tableAulePieneInCorso);
            ctrlCorso cCorso = new ctrlCorso();

            string query2 = @"
                    SELECT
                         Attivita.id AS IdAttivita, Stanze.numero, Persone.idattivita AS IdAttivitaPersona
                    FROM
                             Attivita INNER JOIN
                             DettaglioAttivita ON Attivita.id = DettaglioAttivita.idattivita INNER JOIN
                             Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                             Stanze ON Attivita.idstanza = Stanze.id LEFT OUTER JOIN
                             Persone ON Attivita.id = Persone.idattivita
                    GROUP BY
                             Attivita.id, Attivita.descrizione, Corsi.id, Corsi.nome, Stanze.numero, Stanze.id, Stanze.capienza,
                             Persone.idattivita
                    HAVING
                             (MAX(DettaglioAttivita.giorno) >= { fn NOW() })";

            SqlDataAdapter sda2 = new SqlDataAdapter(query2, connector.Connessione);
            DataTable tableAttivitaInCorsoOvuote = new DataTable();
            sda2.Fill(tableAttivitaInCorsoOvuote);
            Attivita attività = new Attivita();
            foreach (DataRow row in tableAttivitaInCorsoOvuote.Rows)
            {
                if (row["IdAttivitaPersona"] == DBNull.Value)
                {
                    attività = GetAttivitabyId((Guid)row["IdAttivita"]);
                    listaAttivita.Add(attività);
                }
                else
                {
                    foreach (DataRow rowAulePieneInCorso in tableAulePieneInCorso.Rows)
                    {
                        if ((Guid)row["IdAttivita"] == (Guid)rowAulePieneInCorso["IdAttivita"])
                        {
                            attività = GetAttivitabyId((Guid)rowAulePieneInCorso["IdAttivita"]);
                            listaAttivita.Add(attività);
                            break;
                        }
                    }
                }

                attività = null;
            }
            return listaAttivita;
        }

        /// <summary>
        /// Controlla se esiste già un'attività a Tempo Indeterminato all'interno della Stanza Specificata
        /// </summary>
        /// <param name="numeroStanza">Numero di Stanza da verificare</param>
        /// <returns></returns>
        public bool ControlloEsistenzaAttivitàIndeterminata(int numeroStanza)
        {
            string query;
            query = @"SELECT Attivita.id, Corsi.codice, Corsi.nome,Corsi.datainizio
                    ,Corsi.datafine, Attivita.descrizione,Attivita.senzafine AS SenzaFine, Stanze.numero
                    FROM Attivita LEFT OUTER JOIN
                         Corsi ON Attivita.idcorso = Corsi.id LEFT OUTER JOIN
                         Stanze ON Attivita.idstanza = Stanze.id
                    WHERE Attivita.senzafine = 1 AND Stanze.numero=" + numeroStanza;

            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            if (dt.Rows.Count > 0)
            {
                return true;
            }

            return false;
        }

        public virtual List<Attivita> SelectAllAttività()
        {
            string query;
            query = @"SELECT
                                    Attivita.id AS Id, Corsi.id AS IdCorso, Corsi.codice AS Codice, Corsi.nome AS Corso,
                                    Corsi.datainizio AS DataInizio, Corsi.datafine AS DataFine,
                                    Attivita.descrizione AS Descrizione, Stanze.id AS IdStanza, Stanze.numero AS Aula, Stanze.capienza
                    FROM
                                    Attivita LEFT OUTER JOIN
                                    Corsi ON Attivita.idcorso = Corsi.id LEFT OUTER JOIN
                                    Stanze ON Attivita.idstanza = Stanze.id
                    ORDER BY DataFine DESC";
            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Attivita> listaAttivita = new List<Attivita>();
            foreach (DataRow riga in dt.Rows)
            {
                Attivita a = new Attivita();
                a.Id = (Guid)riga["Id"];
                a.Descrizione = (string)riga["Descrizione"];
                if (riga["Codice"] != DBNull.Value)
                {
                    a.Corso = new Corso();
                    a.Corso.Id = (Guid)riga["IdCorso"];
                    a.Corso.Codice = (string)riga["Codice"];
                    a.Corso.Nome = (string)riga["Corso"];
                    a.Corso.DataInizio = (DateTime)riga["DataInizio"];
                    if (riga["DataFine"] != DBNull.Value)
                        a.Corso.DataFine = (DateTime?)riga["DataFine"];
                }
                a.Stanza = new Stanza();
                a.Stanza.Id = (Guid)riga["IdStanza"];
                a.Stanza.Numero = (int)riga["Aula"];
                a.Stanza.Capienza = (int)riga["Capienza"];
                listaAttivita.Add(a);
            }
            return listaAttivita;
        }

        /// <summary>
        /// Ricerca in tabella attivita con join(metodo completamente personalizzabile)
        /// </summary>
        /// <param name="campi"></param>
        /// <param name="condizione"></param>
        /// <param name="ordinamento"></param>
        /// <returns>Rest. un datatable</returns>
        public virtual Attivita SelectAttivitaByCorsoStanza(Corso corso)
        {
            Attivita attivita = new Attivita();
            string query = "SELECT Attivita.id AS Id, Corsi.datainizio AS CorsoInizio,Corsi.codice AS CodiceCorso,Corsi.nome AS NomeCorso, Corsi.numeroore AS NumeroOre "
                    + ", Attivita.descrizione AS DescrizioneAttivita, Attivita.senzafine AS SenzaFine, Stanze.numero AS NumeroStanza, Stanze.id AS IdStanza "
                    + ", Stanze.capienza AS Capienza "
                    + "FROM Attivita LEFT OUTER JOIN "
                    + "DettaglioAttivita ON DettaglioAttivita.idattivita = Attivita.id INNER JOIN "
                    + "Corsi ON Attivita.idcorso = Corsi.id INNER JOIN "
                    + "Stanze ON Attivita.idstanza = Stanze.id "
                    + "WHERE Attivita.idcorso = '" + corso.Id + "'";

            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            Attivita a = new Attivita();
            foreach (DataRow row in dt.Rows)
            {
                a.Id = (Guid)row["Id"];
                a.Descrizione = (string)row["DescrizioneAttivita"];
                a.SenzaFine = (bool)row["SenzaFine"];
                a.Corso = new Corso();
                a.Corso.Id = corso.Id;
                a.Corso.Nome = (string)row["NomeCorso"];
                a.Corso.DataInizio = (DateTime)row["CorsoInizio"];
                a.Corso.Codice = (string)row["CodiceCorso"];
                a.Corso.NumeroOre = (int)row["NumeroOre"];
                a.Stanza = new Stanza();
                a.Stanza.Id = (Guid)row["IdStanza"];
                a.Stanza.Numero = (int)row["NumeroStanza"];
                a.Stanza.Capienza = (int)row["Capienza"];
            }
            return a;
        }

        /// <summary>
        /// Seleziona tutte le attività
        /// </summary>
        /// <returns></returns>
        public List<Attivita> SelezionaTutto(DateTime? datainizio, DateTime? datafine, string nomecorso = "")
        {
            string sql = @"SELECT Attivita.id AS IdAttivita, Corsi.id AS IdCorso, Corsi.codice AS CodCorso, Corsi.datainizio AS DataInizio, Corsi.nome AS Nome, Corsi.numeroore AS Ore,
                      Corsi.datafine AS DataFine, Attivita.idcorso AS IdCorso, Attivita.descrizione AS Descrizione, Attivita.senzafine AS SenzaFine, Attivita.idstanza AS IdStanza,
                      Stanze.numero AS Numero
                FROM Attivita LEFT OUTER JOIN
                    Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                    Stanze ON Attivita.idstanza = Stanze.id
                WHERE (Corsi.datafine > '" + DateTime.Now.Date + "') AND (Corsi.nome LIKE '%" + nomecorso.Replace("'", "''") + "%') OR Attivita.senzafine='True'";

            SqlDataAdapter com = new SqlDataAdapter(sql, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            if (dt.Rows.Count == 0) { return null; }

            DateTime DataFine = new DateTime();
            List<Attivita> Attivita = new List<Attivita>();
            foreach (DataRow item in dt.Rows)
            {
                Attivita oAttivita = new Attivita();
                if (item["IdCorso"] != DBNull.Value)
                {
                    if (item["DataFine"] != DBNull.Value)
                        DataFine = (DateTime)item["DataFine"];

                    oAttivita.Corso = new Corso()
                    {
                        Id = (Guid)item["IdCorso"],
                        Codice = item["CodCorso"].ToString(),
                        DataInizio = (DateTime)item["DataInizio"],
                        DataFine = (DateTime)DataFine,
                        Nome = item["Nome"].ToString(),
                        NumeroOre = (int)item["Ore"]
                    };
                }

                oAttivita.Id = (Guid)item["IdAttivita"];
                oAttivita.Descrizione = item["Descrizione"].ToString();
                oAttivita.SenzaFine = (bool)item["SenzaFine"];

                oAttivita.Stanza = new Stanza()
                {
                    Id = (Guid)item["IdStanza"],
                    Numero = (int)item["Numero"]
                };
                Attivita.Add(oAttivita);
            }
            return Attivita;
        }

        public List<DettaglioAttivita> GetDettagliByAttivitaId(Guid id)
        {
            List<DettaglioAttivita> listaDettagli = new List<DettaglioAttivita>();
            string query;
            query = "SELECT DettaglioAttivita.id, DettaglioAttivita.giorno AS Giorno, DettaglioAttivita.orainizio AS OraInizio, "
                + "DettaglioAttivita.orafine AS OraFine,DettaglioAttivita.minutiinizio AS MinutiInizio,DettaglioAttivita.minutifine AS MinutiFine "
                + "FROM  DettaglioAttivita "
                + "where DettaglioAttivita.idattivita = '" + id + "'"
                + " ORDER BY Giorno";
            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            foreach (DataRow dr in dt.Rows)
            {
                listaDettagli.Add(new DettaglioAttivita()
                {
                    Giorno = (DateTime)dr["Giorno"],
                    Id = (Guid)dr["id"],
                    MinutiFine = (int)dr["MinutiFine"],
                    MinutiInizio = (int)dr["MinutiInizio"],
                    OraFine = (int)dr["OraFine"],
                    OraInizio = (int)dr["OraInizio"]
                });
            }
            if (attivita != null && attivita.DettagliAttivita != null)
                attivita.DettagliAttivita = listaDettagli;
            return listaDettagli;
        }

        public List<Model.Attivita> GetAttivitaByCodiceTessera(string codice)
        {
            List<Model.Attivita> listaAttivitaPersona = new List<Model.Attivita>();
            DataTable dataTable = new DataTable();

            string query = @"SELECT     Attivita.id As idAttivita, Attivita.descrizione AS descrizioneAttivita, MIN(DettaglioAttivita.giorno) AS Min, { fn NOW() } AS Expr1, MAX(DettaglioAttivita.giorno) AS Max
                            FROM         Persone INNER JOIN
                            Attivita ON Persone.idattivita = Attivita.id INNER JOIN
                            Tessere ON Persone.idtessera = Tessere.id LEFT OUTER JOIN
                            DettaglioAttivita ON Attivita.id = DettaglioAttivita.idattivita
                            WHERE     (Tessere.codice = '" + codice + @"')
                            GROUP BY Attivita.id, Attivita.descrizione, Attivita.senzafine
                            HAVING      ('" + DateTime.Now.Date + "' <= MAX(DettaglioAttivita.giorno)) OR Attivita.senzafine = 'True'";// AND (MIN(DettaglioAttivita.giorno) >= '"+DateTime.Now.Date+"')";

            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            sda.Fill(dataTable);

            foreach (DataRow riga in dataTable.Rows)
            {
                Model.Attivita attività = new Model.Attivita();
                attività.Id = (Guid)riga["idAttivita"];
                attività.Descrizione = (string)riga["descrizioneAttivita"];
                listaAttivitaPersona.Add(attività);
            }

            return listaAttivitaPersona;
        }

        public Attivita GetAttivitabyId(Guid id)
        {
            string sql =
  "SELECT  Stanze.id as StanzaId,Corsi.id as CorsoId,Corsi.nome, Attivita.descrizione, Attivita.senzafine, Stanze.numero, Attivita.id,Corsi.codice AS CodCorso "
                    + "FROM  Attivita LEFT OUTER JOIN "
                    + "Corsi ON Attivita.idcorso = Corsi.id INNER JOIN "
                    + "Stanze ON Attivita.idstanza = Stanze.id "
                    + " WHERE Attivita.id='" + id + "'";
            SqlDataAdapter com = new SqlDataAdapter(sql, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            this.attivita = new Attivita();
            attivita.Id = id;
            attivita.Descrizione = dt.Rows[0]["descrizione"].ToString();
            attivita.SenzaFine = (bool)dt.Rows[0]["senzafine"];
            if (!attivita.SenzaFine)
            {
                attivita.DettagliAttivita = GetDettagliByAttivitaId(id);
                attivita.Corso = new ctrlCorso().GetCorsoById((Guid)dt.Rows[0]["CorsoId"]);
            }
            attivita.Stanza = new ctrlStanza().GetStanzaById((Guid)dt.Rows[0]["StanzaId"]);
            return this.attivita;
        }

        public Guid GetIdAttivitaByPersona(Persona persona)
        {
            string query = @"
                SELECT     Attivita.idcorso, Attivita.descrizione, Attivita.id, Attivita.senzafine, Attivita.idstanza, MAX(DettaglioAttivita.giorno) AS Expr1
                FROM         Persone INNER JOIN
                Attivita ON Persone.idattivita = Attivita.id INNER JOIN
                DettaglioAttivita ON Attivita.id = DettaglioAttivita.idattivita
                where Persone.id='" + persona.Id + @"'
                GROUP BY Attivita.idcorso, Attivita.descrizione, Attivita.id, Attivita.idstanza, Attivita.senzafine
                ORDER BY Expr1
                ";
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            DataTable dataTable = new DataTable();
            sda.Fill(dataTable);
            if (dataTable.Rows.Count > 0)
                return (Guid)dataTable.Rows[0]["Attivita.id"];
            else
                return Guid.Empty;
        }

        public Attivita GetAttivitaByPersona(Persona persona)
        {
            string query = @"
                SELECT     Attivita.idcorso, Attivita.descrizione, Attivita.id AS idAttivita, Attivita.senzafine, Attivita.idstanza, MAX(DettaglioAttivita.giorno) AS Expr1
                FROM         Persone INNER JOIN
                Attivita ON Persone.idattivita = Attivita.id INNER JOIN
                DettaglioAttivita ON Attivita.id = DettaglioAttivita.idattivita
                where Persone.id='" + persona.Id + @"'
                GROUP BY Attivita.idcorso, Attivita.descrizione, Attivita.id, Attivita.idstanza, Attivita.senzafine
                ORDER BY Expr1
                ";
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            DataTable dataTable = new DataTable();
            sda.Fill(dataTable);
            if (dataTable.Rows.Count > 0)
                return GetAttivitabyId((Guid)dataTable.Rows[0]["idAttivita"]);
            else
                return null;
        }

        public string getCorsoByPersona(Persona persona)
        {
            string sql;
            sql = @"SELECT Persone.id, Persone.nome, Persone.cognome, Corsi.nome AS Corso, Attivita.id AS Id, Corsi.codice AS Codice,
                    Corsi.datainizio AS DataInizio, Corsi.datafine as Datafine, Attivita.descrizione AS Descrizione, Corsi.id AS IdCorso,
                    Stanze.id AS IdStanza, Stanze.numero AS Numero, Stanze.capienza AS Capienza
                    FROM Persone INNER JOIN
                    Attivita ON Persone.idattivita = Attivita.id LEFT OUTER JOIN
                    Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                    Stanze ON Attivita.idstanza = Stanze.id
                    WHERE Persone.id='" + persona.Id + "'";

            SqlDataAdapter com = new SqlDataAdapter(sql, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            if (dt.Rows.Count > 0)
            {
                Attivita a = new Attivita();
                foreach (DataRow riga in dt.Rows)
                {
                    a.Id = (Guid)riga["Id"];
                    a.Descrizione = (string)riga["Descrizione"];
                    if (riga["Codice"] != DBNull.Value)
                    {
                        a.Corso = new Corso();
                        a.Corso.Id = (Guid)riga["IdCorso"];
                        a.Corso.Codice = (string)riga["Codice"];
                        a.Corso.Nome = (string)riga["Corso"];
                        a.Corso.DataInizio = (DateTime)riga["DataInizio"];
                        if (riga["DataFine"] != DBNull.Value)
                            a.Corso.DataFine = (DateTime?)riga["DataFine"];
                    }
                    a.Stanza = new Stanza();
                    a.Stanza.Id = (Guid)riga["IdStanza"];
                    a.Stanza.Numero = (int)riga["Numero"];
                    a.Stanza.Capienza = (int)riga["Capienza"];
                }
                return a.ToString();
            }
            else
                return "";
        }
    }
}